package cn.com.se.设计模式.责任链.test;

import com.alibaba.fastjson.JSONObject;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @Description 校验链实现
 * @Author:hu.rl
 * @Date:2019-05-08 10:35
 * @Version 1.0
 **/
public class CheckChain {
    /**
     * 用List集合来存储过滤规则
     */
    private List<CheckFilter> filters = Collections.synchronizedList(new ArrayList<CheckFilter>());

    /**
     * 往规则链条中添加规则
     *
     * @param checkFilter
     * @return
     */
    public CheckChain addFilter(CheckFilter checkFilter) {
        filters.add(checkFilter);
        // 代码的设计技巧:Chain链添加过滤规则结束后返回添加后的Chain，方便我们下面doFilter函数的操作
        return this;
    }

    /**
     * 拦截方法
     *
     * @param req
     * @param resp
     * @param chain
     */
    public JSONObject doFilter(JSONObject req, JSONObject resp, CheckChain chain) {
        // 根据设置链节点个数进行不同业务校验
        resp.put("respCode", "000000");
        resp.put("respMsg", "成功");
        req.put("count", req.containsKey("count") ? req.getIntValue("count") + 1 : 0);
        if (req.getIntValue("count") == filters.size()) {
            return resp;
        }
        // 每添加一个过滤规则，index自增1
        CheckFilter f = filters.get(req.getIntValue("count"));
        // 根据索引值获取对应的规律规则对字符串进行处理
        return f.check(req, resp, chain);
    }
}
